/**
 * 函数防抖 (只执行最后一次点击)
 */
export const debounce = <T extends (...args: any) => any>(fn: T, delay: number = 500, triggleNone?: boolean) => {
  let timer: number | undefined;
  return function (this: any, ...args: Parameters<T>) {
    if (timer) {
      clearTimeout(timer);
    }
    if (triggleNone) {
      const firstClick = !timer
      //如果是第一次点击，则直接执行
      if (firstClick) {
        fn.apply(this, args);
      }
      //若不是第一次点击，则当计时器时间到了之后将t重新置为null，此时再点击则为第一次点击
      timer = setTimeout(() => {
        timer = undefined;
      }, delay);

    } else {
      timer = setTimeout(() => {
        // timer = undefined;
        fn.apply(this, args);
      }, delay);
    }

  };
};
/**
 * 函数节流
 */
export const throttle = <T extends (...args: any) => any>(
  fn: T,
  interval: number = 500
) => {
  let last: number;
  let timer: number | undefined;
  return function (this: any, ...args: Parameters<T>) {
    let now = +new Date();
    if (last && now - last < interval) {
      clearTimeout(timer);
      timer = setTimeout(() => {
        last = now;
        fn.apply(this, args);
      }, interval);
    } else {
      last = now;
      fn.apply(this, args);
    }
  };
};
/**
 * 进行延时，以达到可以简写代码的目的，比如
 * await sleep(20)将会阻塞20ms
 */
export const sleep = (value = 30) =>
	new Promise((resolve) => {
		setTimeout(() => {
			resolve(null);
		}, value);
	});


/**
 * @description 获取页面路径，不传参则默认获取当前页面路径
 */
export const page = (index = 1) => {
	const pages = getCurrentPages()
	// 某些特殊情况下(比如页面进行redirectTo时的一些时机)，pages可能为空数组
	return `/${pages[pages.length - index]?.route ?? ''}`
}

/**
 * @description 运行期判断平台
 * @returns {string} 返回所在平台(小写)
 * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台
 */
export const os = () : string => {
	return sys().platform.toLowerCase();
};
/**
 * @description 获取系统信息同步接口
 * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync
 */
export const sys = () => {
	return uni.getSystemInfoSync();
};